Name: Jeremy Hemberger Email: Institution: University of Wisconsin - Madison | Department of Entomology

Import packages

library(cowplot)

********************************************************
Note: As of version 1.0.0, cowplot does not change the
  default ggplot2 theme anymore. To recover the previous
  behavior, execute:
  theme_set(theme_cowplot())
********************************************************


Attaching package: ‘cowplot’

The following object is masked from ‘package:ggmap’:

    theme_nothing

Import data

bumbles.df data are cleaned in C2019_HistBumble_DataCleanup.rmd. Briefly, data from GBIF and Bumblebee Watch are combined, cleaned, filtered, and restricted to upper Midwest states.

histag.df data are cleaned and prepped in C2019_HistAg_DataCleanup.Rmd. Not much done other than filtering out population data.

bumbles.df <- read_csv("./analysis_bumbles.csv")
histag.df <- read_csv("./histag_clean.csv")

Data preparation

Split bumble bee data by quantile (equal records per period)

bumbles.df <- bumbles.df %>%
  filter(!is.na(year)) %>%
  mutate(subgenus = ifelse(species %in% c("Bombus affinis",
                                          "Bombus terricola"),
                           "Bombus",
                           ifelse(species %in% c("Bombus griseocollis",
                                                 "Bombus rufocinctus",
                                                 "Bombus fraternus"),
                                  "Cullumanobombus",
                                  ifelse(species %in% c("Bombus vagans",
                                                        "Bombus bimaculatus",
                                                        "Bombus impatiens",
                                                        "Bombus ternarius",
                                                        "Bombus perplexus",
                                                        "Bombus sandersoni"),
                                         "Pyrobombus",
                                         ifelse(species %in% c("Bombus auricomus"),
                                                "Bombias",
                                                ifelse(species %in% c("Bombus fervidus",
                                                                      "Bombus pensylvanicus"),
                                                       "Thoracobombus",
                                                       ifelse(species %in% c("Bombus citrinus",
                                                                              "Bombus variabilis",
                                                                              "Bombus ashtoni"),
                                                              "Psithyrus",
                                                              "Subterraneobombus")))))))

8 bins

bin8.bumbles.df <- rbin_quantiles(data = bumbles.df, 
                                  response = species,
                                  predictor = year,
                                  bins = 8)
bin8.bumbles.df
Binning Summary
-----------------------------
Method               Quantile 
Response             species 
Predictor            year 
Bins                 8 
Count                26210 
Goods                0 
Bads                 0 
Entropy              NA 
Information Value    NA 
bumbles.df <- bumbles.df %>%
  mutate(bin_8 = case_when(
    year < 1924 ~ "1900-1923",
    between(year, 1924, 1946) ~ "1924-1946",
    between(year, 1947, 1962) ~ "1947-1962",
    between(year, 1963, 1968) ~ "1963-1968",
    between(year, 1969, 1972) ~ "1969-1972",
    between(year, 1973, 1993) ~ "1973-1993",
    between(year, 1994, 2013) ~ "1994-2013",
    between(year, 2014, 2019) ~ "2013-present"
  ))
bumbles.df$bin_8 <- factor(bumbles.df$bin_8,
                           levels = c("1900-1923",
                                      "1924-1946",
                                      "1947-1962",
                                      "1963-1968",
                                      "1969-1972",
                                      "1973-1993",
                                      "1994-2013",
                                      "2013-present"))
table(bumbles.df$bin_8)

   1900-1923    1924-1946    1947-1962    1963-1968    1969-1972    1973-1993 
        2893         3658         3071         2621         4057         3286 
   1994-2013 2013-present 
        3313         3311 

5 bins

bin5.bumbles.df <- rbin_quantiles(data = bumbles.df, 
                                  response = species,
                                  predictor = year,
                                  bins = 5)
bumbles.df <- bumbles.df %>%
  mutate(bin_5 = case_when(
    year < 1936 ~ "1900-1935",
    between(year, 1936, 1963) ~ "1936-1963",
    between(year, 1964, 1971) ~ "1964-1971",
    between(year, 1972, 2006) ~ "1972-2006",
    between(year, 2007, 2019) ~ "2007-present"
  ))
bumbles.df$bin_5 <- factor(bumbles.df$bin_5,
                           levels = c("1900-1935",
                                      "1936-1963",
                                      "1964-1971",
                                      "1972-2006",
                                      "2007-present"))
table(bumbles.df$bin_5)

   1900-1935    1936-1963    1964-1971    1972-2006 2007-present 
        5131         5168         4172         6353         5386 

3 bins

bin3.bumbles.df <- rbin_quantiles(data = bumbles.df, 
                                  response = species,
                                  predictor = year,
                                  bins = 3)
bumbles.df <- bumbles.df %>%
  mutate(bin_3 = case_when(
    year < 1960 ~ "1900-1959",
    between(year, 1960, 1981) ~ "1960-1981",
    between(year, 1982, 2019) ~ "1982-present",
  ))
bumbles.df$bin_3 <- factor(bumbles.df$bin_3,
                           levels = c("1900-1959",
                                      "1960-1981",
                                      "1982-present"))
table(bumbles.df$bin_3)

   1900-1959    1960-1981 1982-present 
        8397         9075         8738 

Rarefied species richness per bin

Per Bartomeus et al. (2013) PNAS paper. Rarefy to 80% of number of specimens in smallest bin. Smallest bin = 1963-1968 @ 2621 * 0.8 = 2097 specimens

JK this is based on Richardson et al. (2018). Using iNEXT.

5 period estimated spp. richness

8 period estimated spp. richness

Permutation test

perm.test <- function(data, n.perm) {
  temp.data <- data %>%
    filter(order == 0)
  true.lm <- lm(qD ~ site,
                data = temp.data)
  true.r2 <- summary(lm)$r.squared
  x <- seq(1, n.perm, 1)
  rsq <- list()
  order <- list()
  for (i in x) {
    rand.data.df <- data.frame(temp.data[sample(nrow(temp.data)),])
    rand.data.df$time <- seq.int(nrow(rand.data.df))
    lm <- lm(qD ~ time,
             data = rand.data.df)
    rsq[[i]] <- data.frame(summary(lm)$r.squared)
    order[[i]] <- data.frame(toString(c(rand.data.df$site)))
  }
  rsq.df <- bind_rows(rsq)
  colnames(rsq.df) <- "r2"
  order.df <- bind_rows(order)
  colnames(order.df) <- "site_order"
  permresults.df <- bind_cols(rsq.df, 
                              order.df)
  p.prop <- permresults.df %>%
    summarise(p.prop = sum(r2 > true.r2))
  p.value <- p.prop / nrow(permresults.df)
  assign("permtest.df",
         permresults.df,
         envir = .GlobalEnv)
  print(paste("p-value:",
              p.value))
}
perm.test(rareest.8period.df, n.perm = 1000)
perm.test(rareest.5period.df, n.perm = 1000)

Relative abundance over time

by county and 8 period average relative abundance change

by county and 2 period relative abundance change

bumbles.relabun.bycty.df <- bumbles.df %>%
  dplyr::select(county, state, species, subgenus, t_period) %>%
  group_by(county, state, species, subgenus, t_period) %>%
  summarise(n_bumbles = n()) %>%
  mutate(state_name = abbr2state(state)) %>%
  ungroup()
bumbles.relabun.bycty.df
total.abun.bybin.df <- bumbles.relabun.bycty.df %>%
  group_by(t_period, county) %>%
  summarise(total_bumbles = sum(n_bumbles))
total.abun.bybin.df
bumbles.relabun.bycty.df <- bumbles.relabun.bycty.df %>%
  left_join(total.abun.bybin.df,
            by = c("t_period" = "t_period", "county" = "county")) %>%
  mutate(relative_abun = n_bumbles / total_bumbles)
bumbles.relabun.bycty.df

bumbles.relabun.bycty.df$t_period <- factor(bumbles.relabun.bycty.df$t_period,
                                            levels = c("historical",
                                                       "contemp"))
bumbles.relabun.bycty.df
bumbles.deltarelabun.bycty.df
bumbles.deltarelabun.bycty.df <- bumbles.relabun.bycty.df %>%
  ungroup() %>%
  group_by(county, state, species) %>%
  mutate(delta_ra = relative_abun - lead(relative_abun)) %>%
  mutate(state_full = abbr2state(state))
bumbles.deltarelabun.bycty.df
bumbles.deltarelabun.bycty.df <-  full_join(ungroup(bumbles.deltarelabun.bycty.df),
                                            ungroup(us.county.midwest),
                                            by = c("county" = "CNTY_NAME"))

bumbles.deltarelabun.bycty.plot <- ggplot() + 
  geom_polygon(data = bumbles.deltarelabun.bycty.df,
               mapping = aes(x = long,
                             y = lat,
                             fill = delta_ra,
                             group = group)) +
  geom_polygon(data = us.county.midwest,
               mapping = aes(x = long,
                             y = lat,
                             group = group),
               fill = "transparent",
               color = "gray80",
               size = 0.25,
               na.rm = TRUE) + 
  scale_fill_distiller(type = "div",
                       palette = "RdYlBu",
                       na.value = "gray80") +
  coord_map("stereographic") +
  facet_wrap(~ species,
             labeller = as_labeller(species),
             ncol = 5) + 
  theme_void()
bumbles.deltarelabun.bycty.plot

by state

bumbles.relabun.bystate.df <- bumbles.df %>%
  dplyr::select(state, species, subgenus, bin_5) %>%
  group_by(state, species, subgenus, bin_5) %>%
  summarise(n_bumbles = n()) %>%
  mutate(state_name = abbr2state(state)) %>%
  ungroup()
bumbles.relabun.bystate.df
total.abun.bybin.df <- bumbles.relabun.bystate.df %>%
  group_by(bin_5, state) %>%
  summarise(total_bumbles = sum(n_bumbles))
total.abun.bybin.df
bumbles.relabun.bystate.df <- bumbles.relabun.bystate.df %>%
  left_join(total.abun.bybin.df,
            by = c("bin_5" = "bin_5", "state" = "state")) %>%
  mutate(relative_abun = n_bumbles / total_bumbles)
bumbles.relabun.bystate.df %>%
  ungroup() %>%
  group_by(species, state) %>%
  mutate(delta_ra = c(NA, diff(relative_abun)))

by time bin only

bumbles.relabun.df <- bumbles.df %>%
  dplyr::select(state, species, subgenus, bin_5,) %>%
  group_by(species, subgenus, bin_5) %>%
  summarise(n_bumbles = n()) %>%
  ungroup()
bumbles.relabun.df
total.abun.bybin.df <- bumbles.relabun.df %>%
  group_by(bin_5) %>%
  summarise(total_bumbles = sum(n_bumbles))
total.abun.bybin.df
bumbles.relabun.df <- bumbles.relabun.df %>%
  left_join(total.abun.bybin.df,
            by = "bin_5") %>%
  mutate(relative_abun = n_bumbles / total_bumbles)
bumbles.relabun.df <- bumbles.relabun.df %>%
  group_by(species) %>%
  mutate(time_period_num = row_number())
bumbles.relabun.df

Plot each:

by time only

bumbles.relabun.df %>%
  ggplot(mapping = aes(label = species)) + 
  # geom_line(mapping = aes(x = bin,
  #                         y = relative_abun,
  #                         color = species,
  #                         group = species),
  #           # color = "#EEC643",
  #           size = 1.25) +
  geom_point(mapping = aes(x = bin_5,
                           y = relative_abun,
                           color = species),
             size = 3) + 
             # col = "#EEC643",
             # alpha = 0.75) + 
  # geom_text(mapping = aes(x = t_period,
  #                         y = relative_abun + 0.1),
  #           color = "black") + 
  # geom_dl(mapping = aes(x = t_period,
  #                       y = relative_abun,
  #                       label = species),
  #         method = "last.points",
  #         color = "black") + 
  geom_smooth(mapping = aes(x = bin_5,
                            y = relative_abun,
                            group = species,
                            color = species),
              method = "lm",
              linetype = 1,
              alpha = 0.1) +
  # scale_color_gradient(low = "#382B01",
  #                      high = "#F4E3A7") + 
  theme_minimal() + 
  scale_y_continuous(limits = c(-0.05, 0.5)) + 
  scale_x_discrete(expand = c(0.01, 0.5)) + 
  # coord_fixed(ratio = 2) + 
  facet_grid(vars(subgenus))

by state only

bumbles.relabun.bystate.df %>%
  ggplot(mapping = aes(label = species)) + 
  # geom_line(mapping = aes(x = bin,
  #                         y = relative_abun,
  #                         color = species,
  #                         group = species),
  #           # color = "#EEC643",
  #           size = 1.25) +
  geom_point(mapping = aes(x = bin_5,
                           y = relative_abun,
                           color = species),
             size = 3) + 
             # col = "#EEC643",
             # alpha = 0.75) + 
  # geom_text(mapping = aes(x = t_period,
  #                         y = relative_abun + 0.1),
  #           color = "black") + 
  # geom_dl(mapping = aes(x = t_period,
  #                       y = relative_abun,
  #                       label = species),
  #         method = "last.points",
  #         color = "black") + 
  geom_smooth(mapping = aes(x = bin_5,
                            y = relative_abun,
                            group = species,
                            color = species),
              method = "lm",
              linetype = 1,
              alpha = 0.1) +
  # scale_color_gradient(low = "#382B01",
  #                      high = "#F4E3A7") + 
  theme_light() + 
  scale_y_continuous(limits = c(-0.05, 0.75)) + 
  scale_x_discrete(expand = c(0.01, 0.5)) + 
  # coord_fixed(ratio = 2) + 
  facet_grid(vars(subgenus))

by county

bumbles.relabun.bycty.df %>%
  ggplot(mapping = aes(label = species)) + 
  # geom_line(mapping = aes(x = bin,
  #                         y = relative_abun,
  #                         color = species,
  #                         group = species),
  #           # color = "#EEC643",
  #           size = 1.25) +
  geom_point(mapping = aes(x = bin_8,
                           y = relative_abun,
                           color = species),
             size = 3) + 
             # col = "#EEC643",
             # alpha = 0.75) + 
  # geom_text(mapping = aes(x = t_period,
  #                         y = relative_abun + 0.1),
  #           color = "black") + 
  # geom_dl(mapping = aes(x = t_period,
  #                       y = relative_abun,
  #                       label = species),
  #         method = "last.points",
  #         color = "black") + 
  geom_smooth(mapping = aes(x = bin_8,
                            y = relative_abun,
                            group = species,
                            color = species),
              method = "lm",
              linetype = 1,
              alpha = 0.1) +
  # scale_color_gradient(low = "#382B01",
  #                      high = "#F4E3A7") + 
  theme_light() + 
  scale_y_continuous(limits = c(-0.05, 1.0)) + 
  scale_x_discrete(expand = c(0.01, 0.5)) + 
  # coord_fixed(ratio = 2) + 
  facet_grid(vars(subgenus))

Relate change in ag with change in relative abundance

Read in data

bumbles.deltarelabun.df <- read_csv("./bumbles_deltarelabun.csv")
bumbles.species.subgenus.df <- bumbles.df %>%
  group_by(species, subgenus) %>%
  distinct(species)
bumbles.deltarelabun.df <- bumbles.deltarelabun.df %>%
  left_join(bumbles.species.subgenus.df,
            by = "species")
midwestag.df <- read_csv("./midwestag.csv")

Combine data

bumble.by.ag.df <- midwestag.df %>%
  dplyr::select(STATE_NAME, 
                CNTY_NAME, 
                SUB_REGION, 
                ag_stat_name, 
                ag_stat_value, 
                year, 
                stat, 
                ag_delta) %>%
  group_by(STATE_NAME, CNTY_NAME, stat) %>%
  summarise(mean_ag_delta = mean(ag_delta,
                                 na.rm = TRUE)) %>%
  left_join(bumbles.deltarelabun.df,
            by = c("CNTY_NAME" = "county", 
                   "STATE_NAME" = "state_full"))

Plot delta_ag vs delta_relabun by species w/overall average

bumble.by.ag.plot <- bumble.by.ag.df %>%
  filter(stat == "RATIO") %>%
  filter(!is.na(mean_delta_ra)) %>%
  ggplot() + 
  geom_vline(xintercept = 0.0,
             color = "black",
             size = 0.75,
             alpha = 0.25) +
  geom_hline(yintercept = 0.0,
             color = "black",
             size = 0.75,
             alpha = 0.25) +
  geom_point(mapping = aes(x = mean_ag_delta,
                           y = mean_delta_ra,
                           fill = species),
             shape = 21,
             color = "black") + 
  geom_smooth(mapping = aes(x = mean_ag_delta,
                            y = mean_delta_ra,
                            group = species,
                            color = species),
              method = "lm",
              se = FALSE) + 
  # geom_smooth(mapping = aes(x = mean_ag_delta,
  #                           y = mean_delta_ra),
  #             method = "lm",
  #             color = "red",
  #             size = 1.5) + 
  xlim(-0.025, 0.075) + 
  ylim(-1, 1) +
  xlab("Mean change in county-level proportion ag") + 
  ylab("Mean change in relative abundance") +
  scale_fill_viridis_d(option = "inferno",
                       direction = 1) +
  scale_color_viridis_d(option = "inferno",
                        direction = 1) + 
  facet_wrap(~ subgenus,
             ncol = 4) +
  theme_minimal() + 
  theme(legend.position = "none") + 
  theme(panel.border = element_rect(color = "gray50",
                                    size = 1.25,
                                    fill = "transparent"))

bumble.by.ag.plot <- direct.label(bumble.by.ag.plot, 
                                  list("extreme.grid",
                                       cex = 0.5))
bumble.by.ag.plot
ggsave("./bumble_byag_plot.png",
       bumble.by.ag.plot,
       height = 4.5,
       width = 7)

Density plot of county-level average ag change for each state

ggplot() + 
  geom_vline(xintercept = 0.0,
             color = "red",
             size = 1.5,
             alpha = 0.5) + 
  geom_density(data = bumble.by.ag.df %>%
                 filter(stat == "RATIO") %>%
                 filter(!is.na(mean_delta_ra)),
               mapping = aes(x = mean_ag_delta,
                             fill = state),
               alpha = 0.75) + 
  scale_fill_viridis_d(option = "inferno",
                       direction = 1) + 
  theme_minimal()

Plot ag ratio vs delta_relabun by species w/overall average

bumble.by.agratio.plot <- midwestag.df %>%
  dplyr::select(STATE_NAME, 
                CNTY_NAME, 
                SUB_REGION, 
                ag_stat_name, 
                ag_stat_value, 
                year, 
                stat, 
                ag_delta) %>%
  filter(stat == "RATIO") %>%
  group_by(STATE_NAME, CNTY_NAME) %>%
  summarise(mean_ag = mean(ag_stat_value,
                           na.rm = TRUE)) %>%
  left_join(bumbles.deltarelabun.df,
            by = c("CNTY_NAME" = "county", 
                   "STATE_NAME" = "state_full")) %>%
  filter(!is.na(mean_delta_ra)) %>%
  ggplot() + 
  geom_hline(yintercept = 0,
             color = "black",
             alpha = 0.25) + 
  geom_point(mapping = aes(x = mean_ag,
                           y = mean_delta_ra,
                           fill = species),
             shape = 21,
             color = "black") + 
  geom_smooth(mapping = aes(x = mean_ag,
                            y = mean_delta_ra,
                            group = species,
                            color = species),
              method = "lm",
              se = FALSE) + 
  # geom_smooth(mapping = aes(x = mean_ag,
  #                           y = mean_delta_ra),
  #             method = "lm",
  #             color = "red",
  #             size = 1.5) + 
  xlim(0, 1) + 
  ylim(-1, 1) +
  xlab("Mean county-level proportion ag") + 
  ylab("Mean change in relative abundance") +
  scale_fill_viridis_d(option = "inferno",
                       direction = 1) +
  scale_color_viridis_d(option = "inferno",
                        direction = 1) + 
  facet_wrap(~ subgenus,
             ncol = 4) +
  theme_minimal() + 
  theme(legend.position = "none") + 
  theme(panel.border = element_rect(color = "gray50",
                                    size = 1.25,
                                    fill = "transparent"))

bumble.by.agratio.plot <- direct.label(bumble.by.agratio.plot, 
                                       list("smart.grid",
                                       cex = 0.5))
Removed 1 rows containing non-finite values (stat_smooth).
bumble.by.agratio.plot
ggsave("./bumble_byagratio_plot.png",
       bumble.by.agratio.plot,
       height = 4.5,
       width = 7)

LS0tCnRpdGxlOiAiQ2g0IHwgSGlzdG9yaWNhbCBBZyAmIEJ1bWJsZSBCZWUgQWJ1bmRhbmNlL0NvbW11bml0eSBDaGFuZ2VzIgpzdWJ0aXRsZTogIkhpc3RvcmljYWwgYnVtYmxlIGJlZSBkYXRhIGNvbWJpbmF0aW9uIGFuZCBtb2RlbGluZyIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoqKk5hbWU6KiogSmVyZW15IEhlbWJlcmdlcgoqKkVtYWlsOioqIGouaGVtYmVyZ2VyLndpc2NAZ21haWwuY29tCioqSW5zdGl0dXRpb246KiogVW5pdmVyc2l0eSBvZiBXaXNjb25zaW4gLSBNYWRpc29uIHwgRGVwYXJ0bWVudCBvZiBFbnRvbW9sb2d5CgojIEltcG9ydCBwYWNrYWdlcwpgYGB7cn0gCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJnZGFsKQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KGdnYWx0KQpsaWJyYXJ5KGdnZm9yY2UpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkobWFwdG9vbHMpCmxpYnJhcnkobWFwcykKbGlicmFyeShtYXBkYXRhKQpsaWJyYXJ5KG1wKQpsaWJyYXJ5KHZlZ2FuKQpsaWJyYXJ5KGlORVhUKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KG9wZW5pbnRybykKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGNvaW4pCmxpYnJhcnkocmJpbikKbGlicmFyeShkaXJlY3RsYWJlbHMpCmBgYAoKIyBJbXBvcnQgZGF0YQpgYnVtYmxlcy5kZmAgZGF0YSBhcmUgY2xlYW5lZCBpbiBgQzIwMTlfSGlzdEJ1bWJsZV9EYXRhQ2xlYW51cC5ybWRgLiAgQnJpZWZseSwgZGF0YSBmcm9tIEdCSUYgYW5kIEJ1bWJsZWJlZSBXYXRjaCBhcmUgY29tYmluZWQsIGNsZWFuZWQsIGZpbHRlcmVkLCBhbmQgcmVzdHJpY3RlZCB0byB1cHBlciBNaWR3ZXN0IHN0YXRlcy4gIAoKYGhpc3RhZy5kZmAgZGF0YSBhcmUgY2xlYW5lZCBhbmQgcHJlcHBlZCBpbiBgQzIwMTlfSGlzdEFnX0RhdGFDbGVhbnVwLlJtZGAuICBOb3QgbXVjaCBkb25lIG90aGVyIHRoYW4gZmlsdGVyaW5nIG91dCBwb3B1bGF0aW9uIGRhdGEuCmBgYHtyfQpidW1ibGVzLmRmIDwtIHJlYWRfY3N2KCIuL2FuYWx5c2lzX2J1bWJsZXMuY3N2IikKaGlzdGFnLmRmIDwtIHJlYWRfY3N2KCIuL2hpc3RhZ19jbGVhbi5jc3YiKQpgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbiAKIyMgU3BsaXQgYnVtYmxlIGJlZSBkYXRhIGJ5IHF1YW50aWxlIChlcXVhbCByZWNvcmRzIHBlciBwZXJpb2QpCmBgYHtyfQpidW1ibGVzLmRmIDwtIGJ1bWJsZXMuZGYgJT4lCiAgZmlsdGVyKCFpcy5uYSh5ZWFyKSkgJT4lCiAgbXV0YXRlKHN1YmdlbnVzID0gaWZlbHNlKHNwZWNpZXMgJWluJSBjKCJCb21idXMgYWZmaW5pcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMgdGVycmljb2xhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3BlY2llcyAlaW4lIGMoIkJvbWJ1cyBncmlzZW9jb2xsaXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyBydWZvY2luY3R1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9tYnVzIGZyYXRlcm51cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkN1bGx1bWFub2JvbWJ1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3BlY2llcyAlaW4lIGMoIkJvbWJ1cyB2YWdhbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMgYmltYWN1bGF0dXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMgaW1wYXRpZW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9tYnVzIHRlcm5hcml1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyBwZXJwbGV4dXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb21idXMgc2FuZGVyc29uaSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeXJvYm9tYnVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3BlY2llcyAlaW4lIGMoIkJvbWJ1cyBhdXJpY29tdXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJpYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3BlY2llcyAlaW4lIGMoIkJvbWJ1cyBmZXJ2aWR1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9tYnVzIHBlbnN5bHZhbmljdXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaG9yYWNvYm9tYnVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzcGVjaWVzICVpbiUgYygiQm9tYnVzIGNpdHJpbnVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyB2YXJpYWJpbGlzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyBhc2h0b25pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzaXRoeXJ1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1YnRlcnJhbmVvYm9tYnVzIikpKSkpKSkKYGBgCgojIyA4IGJpbnMKYGBge3J9CmJpbjguYnVtYmxlcy5kZiA8LSByYmluX3F1YW50aWxlcyhkYXRhID0gYnVtYmxlcy5kZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNwZWNpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3IgPSB5ZWFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucyA9IDgpCmJ1bWJsZXMuZGYgPC0gYnVtYmxlcy5kZiAlPiUKICBtdXRhdGUoYmluXzggPSBjYXNlX3doZW4oCiAgICB5ZWFyIDwgMTkyNCB+ICIxODI0LTE5MjMiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTI0LCAxOTQ2KSB+ICIxOTI0LTE5NDYiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTQ3LCAxOTYyKSB+ICIxOTQ3LTE5NjIiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTYzLCAxOTY4KSB+ICIxOTYzLTE5NjgiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTY5LCAxOTcyKSB+ICIxOTY5LTE5NzIiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTczLCAxOTkzKSB+ICIxOTczLTE5OTMiLAogICAgYmV0d2Vlbih5ZWFyLCAxOTk0LCAyMDEzKSB+ICIxOTk0LTIwMTMiLAogICAgYmV0d2Vlbih5ZWFyLCAyMDE0LCAyMDE5KSB+ICIyMDEzLXByZXNlbnQiCiAgKSkKYnVtYmxlcy5kZiRiaW5fOCA8LSBmYWN0b3IoYnVtYmxlcy5kZiRiaW5fOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMTgyNC0xOTIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTkyNC0xOTQ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk0Ny0xOTYyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk2My0xOTY4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk2OS0xOTcyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk3My0xOTkzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk5NC0yMDEzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxMy1wcmVzZW50IikpCnRhYmxlKGJ1bWJsZXMuZGYkYmluXzgpCmBgYAoKIyMgNSBiaW5zCmBgYHtyfQpiaW41LmJ1bWJsZXMuZGYgPC0gcmJpbl9xdWFudGlsZXMoZGF0YSA9IGJ1bWJsZXMuZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzcGVjaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yID0geWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnMgPSA1KQpidW1ibGVzLmRmIDwtIGJ1bWJsZXMuZGYgJT4lCiAgbXV0YXRlKGJpbl81ID0gY2FzZV93aGVuKAogICAgeWVhciA8IDE5MzYgfiAiMTgyNC0xOTM1IiwKICAgIGJldHdlZW4oeWVhciwgMTkzNiwgMTk2MykgfiAiMTkzNi0xOTYzIiwKICAgIGJldHdlZW4oeWVhciwgMTk2NCwgMTk3MSkgfiAiMTk2NC0xOTcxIiwKICAgIGJldHdlZW4oeWVhciwgMTk3MiwgMjAwNikgfiAiMTk3Mi0yMDA2IiwKICAgIGJldHdlZW4oeWVhciwgMjAwNywgMjAxOSkgfiAiMjAwNy1wcmVzZW50IgogICkpCmJ1bWJsZXMuZGYkYmluXzUgPC0gZmFjdG9yKGJ1bWJsZXMuZGYkYmluXzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjE4MjQtMTkzNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5MzYtMTk2MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5NjQtMTk3MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5NzItMjAwNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDctcHJlc2VudCIpKQp0YWJsZShidW1ibGVzLmRmJGJpbl81KQpgYGAKCiMjIDMgYmlucwpgYGB7cn0KYmluMy5idW1ibGVzLmRmIDwtIHJiaW5fcXVhbnRpbGVzKGRhdGEgPSBidW1ibGVzLmRmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvciA9IHllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zID0gMykKYnVtYmxlcy5kZiA8LSBidW1ibGVzLmRmICU+JQogIG11dGF0ZShiaW5fMyA9IGNhc2Vfd2hlbigKICAgIHllYXIgPCAxOTYwIH4gIjE4MjQtMTk1OSIsCiAgICBiZXR3ZWVuKHllYXIsIDE5NjAsIDE5ODEpIH4gIjE5NjAtMTk4MSIsCiAgICBiZXR3ZWVuKHllYXIsIDE5ODIsIDIwMTkpIH4gIjE5ODItcHJlc2VudCIsCiAgKSkKYnVtYmxlcy5kZiRiaW5fMyA8LSBmYWN0b3IoYnVtYmxlcy5kZiRiaW5fMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMTkwMC0xOTU5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk2MC0xOTgxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk4Mi1wcmVzZW50IikpCnRhYmxlKGJ1bWJsZXMuZGYkYmluXzMpCmBgYAoKYGBge3J9CgpgYGAKCiMjIFJhcmVmaWVkIHNwZWNpZXMgcmljaG5lc3MgcGVyIGJpbgpQZXIgQmFydG9tZXVzIGV0IGFsLiAoMjAxMykgUE5BUyBwYXBlci4gIFJhcmVmeSB0byA4MCUgb2YgbnVtYmVyIG9mIHNwZWNpbWVucyBpbiBzbWFsbGVzdCBiaW4uICBTbWFsbGVzdCBiaW4gPSAxOTYzLTE5NjggQCAyNjIxICogMC44ID0gKjIwOTcgc3BlY2ltZW5zKgoKSksgdGhpcyBpcyBiYXNlZCBvbiBSaWNoYXJkc29uIGV0IGFsLiAoMjAxOCkuICBVc2luZyBgaU5FWFRgLiAgCgojIyMgNSBwZXJpb2QgZXN0aW1hdGVkIHNwcC4gcmljaG5lc3MKYGBge3J9CnJhcmUuYnVtYmxlcy5kZiA8LSBidW1ibGVzLmRmICU+JQogIGRwbHlyOjpzZWxlY3Qoc3BlY2llcywgdF9wZXJpb2QsIGJpbl8zLCBiaW5fNSwgYmluXzgpCnJhcmUuYnVtYmxlcy41YmluLmRmIDwtIHJhcmUuYnVtYmxlcy5kZiAlPiUKICBkcGx5cjo6c2VsZWN0KHNwZWNpZXMsIGJpbl81KSAlPiUKICBncm91cF9ieShiaW5fNSkgJT4lCiAgY291bnQoc3BlY2llcykKcmFyZS5idW1ibGVzLjVwZXJpb2QuZGYgPC0gZGF0YS5mcmFtZSh0aW1lX2JpbiA9IHJhcmUuYnVtYmxlcy41YmluLmRmJGJpbl81LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFidW4gPSByYXJlLmJ1bWJsZXMuNWJpbi5kZiRuKQpyYXJlLmJ1bWJsZXMuNXBlcmlvZCA8LSBsaXN0KCIxIiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMTkwMC0xOTM1Il0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMTkzNi0xOTYzIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMTk2NC0xOTcxIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMTk3Mi0yMDA2Il0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IiA9IHNvcnQocmFyZS5idW1ibGVzLjVwZXJpb2QuZGYkYWJ1bltyYXJlLmJ1bWJsZXMuNXBlcmlvZC5kZiR0aW1lX2JpbiA9PSAiMjAwNy1wcmVzZW50Il0pKQpyYXJlLjVwZXJpb2QuZGYgPC0gaU5FWFQocmFyZS5idW1ibGVzLjVwZXJpb2QsIAogICAgICAgICAgICAgcSA9IDAsCiAgICAgICAgICAgICBkYXRhdHlwZSA9ICJhYnVuZGFuY2UiLAogICAgICAgICAgICAga25vdHMgPSAyMDAsCiAgICAgICAgICAgICAjIGVuZHBvaW50ID0gMjUsMDAwLAogICAgICAgICAgICAgbmJvb3QgPSA1MDApCmdnaU5FWFQocmFyZS41cGVyaW9kLmRmLAogICAgICAgIGNvbG9yLnZhciA9ICJzaXRlIikKcmFyZWVzdC41cGVyaW9kLmRmIDwtIGVzdGltYXRlRChyYXJlLmJ1bWJsZXMuNXBlcmlvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhdHlwZSA9ICJhYnVuZGFuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAiY292ZXJhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMC45ODUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IDAuOTUpCnJhcmVlc3QuNXBlcmlvZC5kZiRzaXRlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJhcmVlc3QuNXBlcmlvZC5kZiRzaXRlKSkKcmFyZWVzdC41cGVyaW9kLnBsb3QgPC0gcmFyZWVzdC41cGVyaW9kLmRmICU+JQogIGZpbHRlcihvcmRlciA9PSAwKSAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fcG9pbnRyYW5nZShtYXBwaW5nID0gYWVzKHggPSBzaXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IHFELkxDTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gcUQuVUNMKSwKICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuOCkgKwogIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoeCA9IHNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcUQpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArIAogIHRoZW1lX21pbmltYWwoKQpyYXJlZXN0LjVwZXJpb2QucGxvdApgYGAKCiMjIyA4IHBlcmlvZCBlc3RpbWF0ZWQgc3BwLiByaWNobmVzcwpgYGB7cn0KcmFyZS5idW1ibGVzLjhiaW4uZGYgPC0gcmFyZS5idW1ibGVzLmRmICU+JQogIGRwbHlyOjpzZWxlY3Qoc3BlY2llcywgYmluXzgpICU+JQogIGdyb3VwX2J5KGJpbl84KSAlPiUKICBjb3VudChzcGVjaWVzKQpyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiA8LSBkYXRhLmZyYW1lKHRpbWVfYmluID0gcmFyZS5idW1ibGVzLjhiaW4uZGYkYmluXzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJ1biA9IHJhcmUuYnVtYmxlcy44YmluLmRmJG4pCnJhcmUuYnVtYmxlcy44cGVyaW9kIDwtIGxpc3QoIjEiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTAwLTE5MjMiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTI0LTE5NDYiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTQ3LTE5NjIiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTYzLTE5NjgiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTY5LTE5NzIiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTczLTE5OTMiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjciID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIxOTk0LTIwMTMiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgiID0gc29ydChyYXJlLmJ1bWJsZXMuOHBlcmlvZC5kZiRhYnVuW3JhcmUuYnVtYmxlcy44cGVyaW9kLmRmJHRpbWVfYmluID09ICIyMDEzLXByZXNlbnQiXSkpCnJhcmUuOHBlcmlvZC5kZiA8LSBpTkVYVChyYXJlLmJ1bWJsZXMuOHBlcmlvZCwgCiAgICAgICAgICAgICBxID0gMCwKICAgICAgICAgICAgIGRhdGF0eXBlID0gImFidW5kYW5jZSIsCiAgICAgICAgICAgICBrbm90cyA9IDIwMCwKICAgICAgICAgICAgICMgZW5kcG9pbnQgPSAyNSwwMDAsCiAgICAgICAgICAgICBuYm9vdCA9IDUwMCkKZ2dpTkVYVChyYXJlLjhwZXJpb2QuZGYsCiAgICAgICAgY29sb3IudmFyID0gInNpdGUiKQpyYXJlZXN0LjhwZXJpb2QuZGYgPC0gZXN0aW1hdGVEKHJhcmUuYnVtYmxlcy44cGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlID0gImFidW5kYW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9ICJjb3ZlcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwLjk4NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gMC45NSkKcmFyZWVzdC44cGVyaW9kLmRmJHNpdGUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmFyZWVzdC44cGVyaW9kLmRmJHNpdGUpKQpyYXJlZXN0LjhwZXJpb2QucGxvdCA8LSByYXJlZXN0LjhwZXJpb2QuZGYgJT4lCiAgZmlsdGVyKG9yZGVyID09IDApICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9wb2ludHJhbmdlKG1hcHBpbmcgPSBhZXMoeCA9IHNpdGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBxRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gcUQuTENMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBxRC5VQ0wpLAogICAgICAgICAgICAgICAgICBzaXplID0gMC44KSArCiAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyh4ID0gc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBxRCksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgeWxhYigiRXN0aW1hdGVkIHNwZWNpZXMgcmljaG5lc3MiKSArIAogIHhsYWIoIlRpbWUgUGVyaW9kIikgKyAKICB0aGVtZV9jbGFzc2ljKCkKcmFyZWVzdC44cGVyaW9kLnBsb3QKYGBgCgojIyMjIFBlcm11dGF0aW9uIHRlc3QKYGBge3J9CnBlcm0udGVzdCA8LSBmdW5jdGlvbihkYXRhLCBuLnBlcm0pIHsKICB0ZW1wLmRhdGEgPC0gZGF0YSAlPiUKICAgIGZpbHRlcihvcmRlciA9PSAwKQogIHRydWUubG0gPC0gbG0ocUQgfiBzaXRlLAogICAgICAgICAgICAgICAgZGF0YSA9IHRlbXAuZGF0YSkKICB0cnVlLnIyIDwtIHN1bW1hcnkobG0pJHIuc3F1YXJlZAogIHggPC0gc2VxKDEsIG4ucGVybSwgMSkKICByc3EgPC0gbGlzdCgpCiAgb3JkZXIgPC0gbGlzdCgpCiAgZm9yIChpIGluIHgpIHsKICAgIHJhbmQuZGF0YS5kZiA8LSBkYXRhLmZyYW1lKHRlbXAuZGF0YVtzYW1wbGUobnJvdyh0ZW1wLmRhdGEpKSxdKQogICAgcmFuZC5kYXRhLmRmJHRpbWUgPC0gc2VxLmludChucm93KHJhbmQuZGF0YS5kZikpCiAgICBsbSA8LSBsbShxRCB+IHRpbWUsCiAgICAgICAgICAgICBkYXRhID0gcmFuZC5kYXRhLmRmKQogICAgcnNxW1tpXV0gPC0gZGF0YS5mcmFtZShzdW1tYXJ5KGxtKSRyLnNxdWFyZWQpCiAgICBvcmRlcltbaV1dIDwtIGRhdGEuZnJhbWUodG9TdHJpbmcoYyhyYW5kLmRhdGEuZGYkc2l0ZSkpKQogIH0KICByc3EuZGYgPC0gYmluZF9yb3dzKHJzcSkKICBjb2xuYW1lcyhyc3EuZGYpIDwtICJyMiIKICBvcmRlci5kZiA8LSBiaW5kX3Jvd3Mob3JkZXIpCiAgY29sbmFtZXMob3JkZXIuZGYpIDwtICJzaXRlX29yZGVyIgogIHBlcm1yZXN1bHRzLmRmIDwtIGJpbmRfY29scyhyc3EuZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlci5kZikKICBwLnByb3AgPC0gcGVybXJlc3VsdHMuZGYgJT4lCiAgICBzdW1tYXJpc2UocC5wcm9wID0gc3VtKHIyID4gdHJ1ZS5yMikpCiAgcC52YWx1ZSA8LSBwLnByb3AgLyBucm93KHBlcm1yZXN1bHRzLmRmKQogIGFzc2lnbigicGVybXRlc3QuZGYiLAogICAgICAgICBwZXJtcmVzdWx0cy5kZiwKICAgICAgICAgZW52aXIgPSAuR2xvYmFsRW52KQogIHByaW50KHBhc3RlKCJwLXZhbHVlOiIsCiAgICAgICAgICAgICAgcC52YWx1ZSkpCn0KcGVybS50ZXN0KHJhcmVlc3QuOHBlcmlvZC5kZiwgbi5wZXJtID0gMTAwMCkKcGVybS50ZXN0KHJhcmVlc3QuNXBlcmlvZC5kZiwgbi5wZXJtID0gMTAwMCkKYGBgCgoKIyBSZWxhdGl2ZSBhYnVuZGFuY2Ugb3ZlciB0aW1lCiMjIGJ5ICoqX2NvdW50eV8qKiBhbmQgOCBwZXJpb2QgYXZlcmFnZSByZWxhdGl2ZSBhYnVuZGFuY2UgY2hhbmdlCmBgYHtyfQpidW1ibGVzLnJlbGFidW4uYnljdHkuZGYgPC0gYnVtYmxlcy5kZiAlPiUKICBkcGx5cjo6c2VsZWN0KGNvdW50eSwgc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fOCkgJT4lCiAgZ3JvdXBfYnkoY291bnR5LCBzdGF0ZSwgc3BlY2llcywgc3ViZ2VudXMsIGJpbl84KSAlPiUKICBzdW1tYXJpc2Uobl9idW1ibGVzID0gbigpKSAlPiUKICBtdXRhdGUoc3RhdGVfbmFtZSA9IGFiYnIyc3RhdGUoc3RhdGUpKSAlPiUKICB1bmdyb3VwKCkKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmCnRvdGFsLmFidW4uYnliaW4uZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmICU+JQogIGdyb3VwX2J5KGJpbl84LCBjb3VudHkpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9idW1ibGVzID0gc3VtKG5fYnVtYmxlcykpCnRvdGFsLmFidW4uYnliaW4uZGYKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBsZWZ0X2pvaW4odG90YWwuYWJ1bi5ieWJpbi5kZiwKICAgICAgICAgICAgYnkgPSBjKCJiaW5fOCIgPSAiYmluXzgiLCAiY291bnR5IiA9ICJjb3VudHkiKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX2FidW4gPSBuX2J1bWJsZXMgLyB0b3RhbF9idW1ibGVzKQoKIyBDYWxjdWxhdGUgY2hhbmdlIGluIHJlbGF0aXZlIGFidW5kYW5jZSBieSBjb3VudHkgb3ZlciB0aW1lIGJpbnMKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkuZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShjb3VudHksIHN0YXRlLCBzcGVjaWVzKSAlPiUKICBtdXRhdGUoZGVsdGFfcmEgPSByZWxhdGl2ZV9hYnVuIC0gbGFnKHJlbGF0aXZlX2FidW4pKSAlPiUKICBzdW1tYXJpc2UobWVhbl9kZWx0YV9yYSA9IG1lYW4oZGVsdGFfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpICU+JQogIG11dGF0ZShzdGF0ZV9mdWxsID0gYWJicjJzdGF0ZShzdGF0ZSkpCgp3cml0ZV9jc3YoYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkuZGYsCiAgICAgICAgICAiYnVtYmxlc19kZWx0YXJlbGFidW4uY3N2IikKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmIDwtICBmdWxsX2pvaW4odW5ncm91cChidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCh1cy5jb3VudHkubWlkd2VzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiID0gIkNOVFlfTkFNRSIpKQogCgpidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiA8LSBidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBtdXRhdGUoaW5jX2RlYyA9IGNhc2Vfd2hlbihtZWFuX2RlbHRhX3JhIDwgLTAuMDUgfiAiRGVjcmVhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4obWVhbl9kZWx0YV9yYSwgLTAuMDI1LCAwLjAyNSkgfiAiTm8gY2hhbmdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX2RlbHRhX3JhID4gMC4wNSB+ICJJbmNyZWFzZSIpKQpidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5wbG90IDwtIGJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmICU+JQogIGZpbHRlcighaXMubmEoaW5jX2RlYykpICU+JQogIGZpbHRlcighKHNwZWNpZXMgJWluJSBjKCJCb21idXMgZnJhdGVybnVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9tYnVzIGFzaHRvbmkiKSkpICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9wb2x5Z29uKG1hcHBpbmcgPSBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gaW5jX2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgYWxwaGEgPSAwLjgpICsgICAgICAgICAgICAgCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1cy5jb3VudHkubWlkd2VzdCwKICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXApLAogICAgICAgICAgICAgICBmaWxsID0gInRyYW5zcGFyZW50IiwKICAgICAgICAgICAgICAgY29sb3IgPSAiZ3JheTgwIiwKICAgICAgICAgICAgICAgc2l6ZSA9IDAuMjUsCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjQzA1NzQ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjNTU3RjMzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjQ0NGNEFCIikpICsKICAjIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHR5cGUgPSAiZGl2IiwKICAjICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiUmRZbEJ1IiwKICAjICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IikgKwogIGNvb3JkX21hcCgic3RlcmVvZ3JhcGhpYyIpICsKICBmYWNldF93cmFwKH4gc3BlY2llcywKICAgICAgICAgICAgIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIoc3BlY2llcyksCiAgICAgICAgICAgICBuY29sID0gNSkgKyAKICB0aGVtZV92b2lkKCkKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkucGxvdAoKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkuaGlzdCA8LSBidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBmaWx0ZXIoIWlzLm5hKGluY19kZWMpKSAlPiUKICBmaWx0ZXIoIShzcGVjaWVzICVpbiUgYygiQm9tYnVzIGZyYXRlcm51cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvbWJ1cyBhc2h0b25pIikpKSAlPiUKICBncm91cF9ieShzcGVjaWVzLCBpbmNfZGVjKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KCkgKyAKICAjIGdlb21fdmxpbmUobWFwcGluZyA9IGFlcyh4aW50ZXJjZXB0ID0gMCksCiAgIyAgICAgICAgICAgIGNvbG9yID0gInRvbWF0byIsCiAgIyAgICAgICAgICAgIHNpemUgPSAwLjUsCiAgIyAgICAgICAgICAgIGFscGhhID0gMC41KSArCiAgIyBnZW9tX2RlbnNpdHkobWFwcGluZyA9IGFlcyh4ID0gbWVhbl9kZWx0YV9yYSksCiAgIyAgICAgICAgICAgICAgYWRqdXN0ID0gNSwKICAjICAgICAgICAgICAgICBmaWxsID0gImdvbGRlbnJvZCIsCiAgIyAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsgCiAgZ2VvbV9jb2wobWFwcGluZyA9IGFlcyh4ID0gaW5jX2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBuLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGluY19kZWMpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNDMDU3NDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM1NTdGMzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNDQ0Y0QUIiKSkgKwogIGZhY2V0X3dyYXAofiBzcGVjaWVzLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBhc19sYWJlbGxlcihzcGVjaWVzKSwKICAgICAgICAgICAgIG5jb2wgPSA1KSArIAogIHRoZW1lX21pbmltYWxfaGdyaWQoKQpidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5oaXN0CmBgYAoKIyMgYnkgKipfY291bnR5XyoqIGFuZCAyIHBlcmlvZCByZWxhdGl2ZSBhYnVuZGFuY2UgY2hhbmdlCmBgYHtyfQpidW1ibGVzLnJlbGFidW4uYnljdHkuZGYgPC0gYnVtYmxlcy5kZiAlPiUKICBkcGx5cjo6c2VsZWN0KGNvdW50eSwgc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCB0X3BlcmlvZCkgJT4lCiAgZ3JvdXBfYnkoY291bnR5LCBzdGF0ZSwgc3BlY2llcywgc3ViZ2VudXMsIHRfcGVyaW9kKSAlPiUKICBzdW1tYXJpc2Uobl9idW1ibGVzID0gbigpKSAlPiUKICBtdXRhdGUoc3RhdGVfbmFtZSA9IGFiYnIyc3RhdGUoc3RhdGUpKSAlPiUKICB1bmdyb3VwKCkKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmCnRvdGFsLmFidW4uYnliaW4uZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmICU+JQogIGdyb3VwX2J5KHRfcGVyaW9kLCBjb3VudHkpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9idW1ibGVzID0gc3VtKG5fYnVtYmxlcykpCnRvdGFsLmFidW4uYnliaW4uZGYKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBsZWZ0X2pvaW4odG90YWwuYWJ1bi5ieWJpbi5kZiwKICAgICAgICAgICAgYnkgPSBjKCJ0X3BlcmlvZCIgPSAidF9wZXJpb2QiLCAiY291bnR5IiA9ICJjb3VudHkiKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX2FidW4gPSBuX2J1bWJsZXMgLyB0b3RhbF9idW1ibGVzKQpidW1ibGVzLnJlbGFidW4uYnljdHkuZGYKCmJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiR0X3BlcmlvZCA8LSBmYWN0b3IoYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmJHRfcGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImhpc3RvcmljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbXAiKSkKYnVtYmxlcy5yZWxhYnVuLmJ5Y3R5LmRmCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoY291bnR5LCBzdGF0ZSwgc3BlY2llcykgJT4lCiAgbXV0YXRlKGRlbHRhX3JhID0gcmVsYXRpdmVfYWJ1biAtIGxlYWQocmVsYXRpdmVfYWJ1bikpICU+JQogIG11dGF0ZShzdGF0ZV9mdWxsID0gYWJicjJzdGF0ZShzdGF0ZSkpCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmCmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmJ5Y3R5LmRmIDwtICBmdWxsX2pvaW4odW5ncm91cChidW1ibGVzLmRlbHRhcmVsYWJ1bi5ieWN0eS5kZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCh1cy5jb3VudHkubWlkd2VzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiID0gIkNOVFlfTkFNRSIpKQoKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkucGxvdCA8LSBnZ3Bsb3QoKSArIAogIGdlb21fcG9seWdvbihkYXRhID0gYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkuZGYsCiAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gZGVsdGFfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCkpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzLmNvdW50eS5taWR3ZXN0LAogICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBsb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiLAogICAgICAgICAgICAgICBjb2xvciA9ICJncmF5ODAiLAogICAgICAgICAgICAgICBzaXplID0gMC4yNSwKICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSArIAogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHR5cGUgPSAiZGl2IiwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlJkWWxCdSIsCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTgwIikgKwogIGNvb3JkX21hcCgic3RlcmVvZ3JhcGhpYyIpICsKICBmYWNldF93cmFwKH4gc3BlY2llcywKICAgICAgICAgICAgIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIoc3BlY2llcyksCiAgICAgICAgICAgICBuY29sID0gNSkgKyAKICB0aGVtZV92b2lkKCkKYnVtYmxlcy5kZWx0YXJlbGFidW4uYnljdHkucGxvdApgYGAKCiMjIGJ5ICoqX3N0YXRlXyoqCmBgYHtyfQpidW1ibGVzLnJlbGFidW4uYnlzdGF0ZS5kZiA8LSBidW1ibGVzLmRmICU+JQogIGRwbHlyOjpzZWxlY3Qoc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fNSkgJT4lCiAgZ3JvdXBfYnkoc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fNSkgJT4lCiAgc3VtbWFyaXNlKG5fYnVtYmxlcyA9IG4oKSkgJT4lCiAgbXV0YXRlKHN0YXRlX25hbWUgPSBhYmJyMnN0YXRlKHN0YXRlKSkgJT4lCiAgdW5ncm91cCgpCmJ1bWJsZXMucmVsYWJ1bi5ieXN0YXRlLmRmCnRvdGFsLmFidW4uYnliaW4uZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmJ5c3RhdGUuZGYgJT4lCiAgZ3JvdXBfYnkoYmluXzUsIHN0YXRlKSAlPiUKICBzdW1tYXJpc2UodG90YWxfYnVtYmxlcyA9IHN1bShuX2J1bWJsZXMpKQp0b3RhbC5hYnVuLmJ5YmluLmRmCmJ1bWJsZXMucmVsYWJ1bi5ieXN0YXRlLmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5ieXN0YXRlLmRmICU+JQogIGxlZnRfam9pbih0b3RhbC5hYnVuLmJ5YmluLmRmLAogICAgICAgICAgICBieSA9IGMoImJpbl81IiA9ICJiaW5fNSIsICJzdGF0ZSIgPSAic3RhdGUiKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX2FidW4gPSBuX2J1bWJsZXMgLyB0b3RhbF9idW1ibGVzKQpidW1ibGVzLnJlbGFidW4uYnlzdGF0ZS5kZiAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc3BlY2llcywgc3RhdGUpICU+JQogIG11dGF0ZShkZWx0YV9yYSA9IGMoTkEsIGRpZmYocmVsYXRpdmVfYWJ1bikpKQpgYGAKCiMjIGJ5ICoqX3RpbWUgYmluIG9ubHlfKioKYGBge3J9CmJ1bWJsZXMucmVsYWJ1bi5kZiA8LSBidW1ibGVzLmRmICU+JQogIGRwbHlyOjpzZWxlY3Qoc3RhdGUsIHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fNSwpICU+JQogIGdyb3VwX2J5KHNwZWNpZXMsIHN1YmdlbnVzLCBiaW5fNSkgJT4lCiAgc3VtbWFyaXNlKG5fYnVtYmxlcyA9IG4oKSkgJT4lCiAgdW5ncm91cCgpCmJ1bWJsZXMucmVsYWJ1bi5kZgp0b3RhbC5hYnVuLmJ5YmluLmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5kZiAlPiUKICBncm91cF9ieShiaW5fNSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2J1bWJsZXMgPSBzdW0obl9idW1ibGVzKSkKdG90YWwuYWJ1bi5ieWJpbi5kZgpidW1ibGVzLnJlbGFidW4uZGYgPC0gYnVtYmxlcy5yZWxhYnVuLmRmICU+JQogIGxlZnRfam9pbih0b3RhbC5hYnVuLmJ5YmluLmRmLAogICAgICAgICAgICBieSA9ICJiaW5fNSIpICU+JQogIG11dGF0ZShyZWxhdGl2ZV9hYnVuID0gbl9idW1ibGVzIC8gdG90YWxfYnVtYmxlcykKYnVtYmxlcy5yZWxhYnVuLmRmIDwtIGJ1bWJsZXMucmVsYWJ1bi5kZiAlPiUKICBncm91cF9ieShzcGVjaWVzKSAlPiUKICBtdXRhdGUodGltZV9wZXJpb2RfbnVtID0gcm93X251bWJlcigpKQpidW1ibGVzLnJlbGFidW4uZGYKYGBgCgojIyMgQ3JlYXRlIGFyZWEgcGxvdCB0byBzaG93IHRlbXBvcmFsIHRyZW5kcwpgYGB7cn0KYnVtYmxlLmFyZWEucGxvdCA8LSBidW1ibGVzLnJlbGFidW4uZGYgJT4lCiAgZ3JvdXBfYnkodGltZV9wZXJpb2RfbnVtKSAlPiUKICBhcnJhbmdlKHJlbGF0aXZlX2FidW4sIAogICAgICAgICAgLmJ5X2dyb3VwID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNwZWNpZXNfZmFjdG9yID0gZmFjdG9yKHNwZWNpZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKC4kc3BlY2llc1suJHRpbWVfcGVyaW9kX251bSA9PSAzXSkpKSAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYXJlYShtYXBwaW5nID0gYWVzKHggPSB0aW1lX3BlcmlvZF9udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlbGF0aXZlX2FidW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IHNwZWNpZXNfZmFjdG9yKSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gRkFMU0UpKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJpbmZlcm5vIiwKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxKSArCiAgZmFjZXRfd3JhcCh+IHN1YmdlbnVzKSArIAogIHRoZW1lX21pbmltYWwoKQpidW1ibGUuYXJlYS5wbG90Cmdnc2F2ZSgiLi9idW1ibGVfYXJlYV9wbG90LnBuZyIsCiAgICAgICBidW1ibGUuYXJlYS5wbG90LAogICAgICAgd2lkdGggPSA3LAogICAgICAgaGVpZ2h0ID0gNCkKYGBgCgoKIyMgUGxvdCBlYWNoOiAKIyMjIGJ5ICoqX3RpbWUgb25seV8qKgpgYGB7cn0KYnVtYmxlcy5yZWxhYnVuLmRmICU+JQogIGdncGxvdChtYXBwaW5nID0gYWVzKGxhYmVsID0gc3BlY2llcykpICsgCiAgIyBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gYmluLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlbGF0aXZlX2FidW4sCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHNwZWNpZXMsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNwZWNpZXMpLAogICMgICAgICAgICAgICMgY29sb3IgPSAiI0VFQzY0MyIsCiAgIyAgICAgICAgICAgc2l6ZSA9IDEuMjUpICsKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IGJpbl81LAogICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzKSwKICAgICAgICAgICAgIHNpemUgPSAzKSArIAogICAgICAgICAgICAgIyBjb2wgPSAiI0VFQzY0MyIsCiAgICAgICAgICAgICAjIGFscGhhID0gMC43NSkgKyAKICAjIGdlb21fdGV4dChtYXBwaW5nID0gYWVzKHggPSB0X3BlcmlvZCwKICAjICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuICsgMC4xKSwKICAjICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgIyBnZW9tX2RsKG1hcHBpbmcgPSBhZXMoeCA9IHRfcGVyaW9kLAogICMgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuLAogICMgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gc3BlY2llcyksCiAgIyAgICAgICAgIG1ldGhvZCA9ICJsYXN0LnBvaW50cyIsCiAgIyAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKyAKICBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBiaW5fNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzcGVjaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLAogICAgICAgICAgICAgIGxpbmV0eXBlID0gMSwKICAgICAgICAgICAgICBhbHBoYSA9IDAuMSkgKwogICMgc2NhbGVfY29sb3JfZ3JhZGllbnQobG93ID0gIiMzODJCMDEiLAogICMgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9ICIjRjRFM0E3IikgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC4wNSwgMC41KSkgKyAKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMC4wMSwgMC41KSkgKyAKICAjIGNvb3JkX2ZpeGVkKHJhdGlvID0gMikgKyAKICBmYWNldF9ncmlkKHZhcnMoc3ViZ2VudXMpKQpgYGAKCiMjIyBieSAqKl9zdGF0ZSBvbmx5XyoqCmBgYHtyfQpidW1ibGVzLnJlbGFidW4uYnlzdGF0ZS5kZiAlPiUKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyhsYWJlbCA9IHNwZWNpZXMpKSArIAogICMgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IGJpbiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzcGVjaWVzKSwKICAjICAgICAgICAgICAjIGNvbG9yID0gIiNFRUM2NDMiLAogICMgICAgICAgICAgIHNpemUgPSAxLjI1KSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBiaW5fNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlbGF0aXZlX2FidW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3BlY2llcyksCiAgICAgICAgICAgICBzaXplID0gMykgKyAKICAgICAgICAgICAgICMgY29sID0gIiNFRUM2NDMiLAogICAgICAgICAgICAgIyBhbHBoYSA9IDAuNzUpICsgCiAgIyBnZW9tX3RleHQobWFwcGluZyA9IGFlcyh4ID0gdF9wZXJpb2QsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biArIDAuMSksCiAgIyAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArIAogICMgZ2VvbV9kbChtYXBwaW5nID0gYWVzKHggPSB0X3BlcmlvZCwKICAjICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAjICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHNwZWNpZXMpLAogICMgICAgICAgICBtZXRob2QgPSAibGFzdC5wb2ludHMiLAogICMgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyh4ID0gYmluXzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3BlY2llcyksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBsaW5ldHlwZSA9IDEsCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjEpICsKICAjIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICIjMzgyQjAxIiwKICAjICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSAiI0Y0RTNBNyIpICsgCiAgdGhlbWVfbGlnaHQoKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjA1LCAwLjc1KSkgKyAKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMC4wMSwgMC41KSkgKyAKICAjIGNvb3JkX2ZpeGVkKHJhdGlvID0gMikgKyAKICBmYWNldF9ncmlkKHZhcnMoc3ViZ2VudXMpKQpgYGAKCiMjIyBieSAqKl9jb3VudHlfKioKYGBge3J9CmJ1bWJsZXMucmVsYWJ1bi5ieWN0eS5kZiAlPiUKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyhsYWJlbCA9IHNwZWNpZXMpKSArIAogICMgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IGJpbiwKICAjICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSByZWxhdGl2ZV9hYnVuLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzcGVjaWVzKSwKICAjICAgICAgICAgICAjIGNvbG9yID0gIiNFRUM2NDMiLAogICMgICAgICAgICAgIHNpemUgPSAxLjI1KSArCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBiaW5fOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHJlbGF0aXZlX2FidW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3BlY2llcyksCiAgICAgICAgICAgICBzaXplID0gMykgKyAKICAgICAgICAgICAgICMgY29sID0gIiNFRUM2NDMiLAogICAgICAgICAgICAgIyBhbHBoYSA9IDAuNzUpICsgCiAgIyBnZW9tX3RleHQobWFwcGluZyA9IGFlcyh4ID0gdF9wZXJpb2QsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biArIDAuMSksCiAgIyAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArIAogICMgZ2VvbV9kbChtYXBwaW5nID0gYWVzKHggPSB0X3BlcmlvZCwKICAjICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAjICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHNwZWNpZXMpLAogICMgICAgICAgICBtZXRob2QgPSAibGFzdC5wb2ludHMiLAogICMgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyh4ID0gYmluXzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gcmVsYXRpdmVfYWJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3BlY2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3BlY2llcyksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBsaW5ldHlwZSA9IDEsCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjEpICsKICAjIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICIjMzgyQjAxIiwKICAjICAgICAgICAgICAgICAgICAgICAgIGhpZ2ggPSAiI0Y0RTNBNyIpICsgCiAgdGhlbWVfbGlnaHQoKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjA1LCAxLjApKSArIAogIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kID0gYygwLjAxLCAwLjUpKSArIAogICMgY29vcmRfZml4ZWQocmF0aW8gPSAyKSArIAogIGZhY2V0X2dyaWQodmFycyhzdWJnZW51cykpCmBgYAoKIyBSZWxhdGUgY2hhbmdlIGluIGFnIHdpdGggY2hhbmdlIGluIHJlbGF0aXZlIGFidW5kYW5jZQojIyBSZWFkIGluIGRhdGEKYGBge3J9CmJ1bWJsZXMuZGVsdGFyZWxhYnVuLmRmIDwtIHJlYWRfY3N2KCIuL2J1bWJsZXNfZGVsdGFyZWxhYnVuLmNzdiIpCmJ1bWJsZXMuc3BlY2llcy5zdWJnZW51cy5kZiA8LSBidW1ibGVzLmRmICU+JQogIGdyb3VwX2J5KHNwZWNpZXMsIHN1YmdlbnVzKSAlPiUKICBkaXN0aW5jdChzcGVjaWVzKQpidW1ibGVzLmRlbHRhcmVsYWJ1bi5kZiA8LSBidW1ibGVzLmRlbHRhcmVsYWJ1bi5kZiAlPiUKICBsZWZ0X2pvaW4oYnVtYmxlcy5zcGVjaWVzLnN1YmdlbnVzLmRmLAogICAgICAgICAgICBieSA9ICJzcGVjaWVzIikKbWlkd2VzdGFnLmRmIDwtIHJlYWRfY3N2KCIuL21pZHdlc3RhZy5jc3YiKQpgYGAKCiMjIENvbWJpbmUgZGF0YQpgYGB7cn0KYnVtYmxlLmJ5LmFnLmRmIDwtIG1pZHdlc3RhZy5kZiAlPiUKICBkcGx5cjo6c2VsZWN0KFNUQVRFX05BTUUsIAogICAgICAgICAgICAgICAgQ05UWV9OQU1FLCAKICAgICAgICAgICAgICAgIFNVQl9SRUdJT04sIAogICAgICAgICAgICAgICAgYWdfc3RhdF9uYW1lLCAKICAgICAgICAgICAgICAgIGFnX3N0YXRfdmFsdWUsIAogICAgICAgICAgICAgICAgeWVhciwgCiAgICAgICAgICAgICAgICBzdGF0LCAKICAgICAgICAgICAgICAgIGFnX2RlbHRhKSAlPiUKICBncm91cF9ieShTVEFURV9OQU1FLCBDTlRZX05BTUUsIHN0YXQpICU+JQogIHN1bW1hcmlzZShtZWFuX2FnX2RlbHRhID0gbWVhbihhZ19kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkgJT4lCiAgbGVmdF9qb2luKGJ1bWJsZXMuZGVsdGFyZWxhYnVuLmRmLAogICAgICAgICAgICBieSA9IGMoIkNOVFlfTkFNRSIgPSAiY291bnR5IiwgCiAgICAgICAgICAgICAgICAgICAiU1RBVEVfTkFNRSIgPSAic3RhdGVfZnVsbCIpKQpgYGAKCiMjIFBsb3QgYGRlbHRhX2FnYCB2cyBgZGVsdGFfcmVsYWJ1bmAgYnkgc3BlY2llcyB3L292ZXJhbGwgYXZlcmFnZQpgYGB7cn0KYnVtYmxlLmJ5LmFnLnBsb3QgPC0gYnVtYmxlLmJ5LmFnLmRmICU+JQogIGZpbHRlcihzdGF0ID09ICJSQVRJTyIpICU+JQogIGZpbHRlcighaXMubmEobWVhbl9kZWx0YV9yYSkpICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC4wLAogICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgc2l6ZSA9IDAuNzUsCiAgICAgICAgICAgICBhbHBoYSA9IDAuMjUpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjAsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICBzaXplID0gMC43NSwKICAgICAgICAgICAgIGFscGhhID0gMC4yNSkgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gbWVhbl9hZ19kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fZGVsdGFfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBzcGVjaWVzKSwKICAgICAgICAgICAgIHNoYXBlID0gMjEsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsgCiAgZ2VvbV9zbW9vdGgobWFwcGluZyA9IGFlcyh4ID0gbWVhbl9hZ19kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX2RlbHRhX3JhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzcGVjaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBzcGVjaWVzKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLAogICAgICAgICAgICAgIHNlID0gRkFMU0UpICsgCiAgIyBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBtZWFuX2FnX2RlbHRhLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9kZWx0YV9yYSksCiAgIyAgICAgICAgICAgICBtZXRob2QgPSAibG0iLAogICMgICAgICAgICAgICAgY29sb3IgPSAicmVkIiwKICAjICAgICAgICAgICAgIHNpemUgPSAxLjUpICsgCiAgeGxpbSgtMC4wMjUsIDAuMDc1KSArIAogIHlsaW0oLTEsIDEpICsKICB4bGFiKCJNZWFuIGNoYW5nZSBpbiBjb3VudHktbGV2ZWwgcHJvcG9ydGlvbiBhZyIpICsgCiAgeWxhYigiTWVhbiBjaGFuZ2UgaW4gcmVsYXRpdmUgYWJ1bmRhbmNlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJpbmZlcm5vIiwKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJpbmZlcm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSkgKyAKICBmYWNldF93cmFwKH4gc3ViZ2VudXMsCiAgICAgICAgICAgICBuY29sID0gNCkgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZ3JheTUwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAidHJhbnNwYXJlbnQiKSkKCmJ1bWJsZS5ieS5hZy5wbG90IDwtIGRpcmVjdC5sYWJlbChidW1ibGUuYnkuYWcucGxvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCJleHRyZW1lLmdyaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXggPSAwLjUpKQpidW1ibGUuYnkuYWcucGxvdApnZ3NhdmUoIi4vYnVtYmxlX2J5YWdfcGxvdC5wbmciLAogICAgICAgYnVtYmxlLmJ5LmFnLnBsb3QsCiAgICAgICBoZWlnaHQgPSA0LjUsCiAgICAgICB3aWR0aCA9IDcpCgpgYGAKCiMjIERlbnNpdHkgcGxvdCBvZiBjb3VudHktbGV2ZWwgYXZlcmFnZSBhZyBjaGFuZ2UgZm9yIGVhY2ggc3RhdGUKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC4wLAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgIHNpemUgPSAxLjUsCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKyAKICBnZW9tX2RlbnNpdHkoZGF0YSA9IGJ1bWJsZS5ieS5hZy5kZiAlPiUKICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RhdCA9PSAiUkFUSU8iKSAlPiUKICAgICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKG1lYW5fZGVsdGFfcmEpKSwKICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbWVhbl9hZ19kZWx0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gc3RhdGUpLAogICAgICAgICAgICAgICBhbHBoYSA9IDAuNzUpICsgCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gImluZmVybm8iLAogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEpICsgCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMgUGxvdCBhZyByYXRpbyB2cyBgZGVsdGFfcmVsYWJ1bmAgYnkgc3BlY2llcyB3L292ZXJhbGwgYXZlcmFnZQpgYGB7cn0KYnVtYmxlLmJ5LmFncmF0aW8ucGxvdCA8LSBtaWR3ZXN0YWcuZGYgJT4lCiAgZHBseXI6OnNlbGVjdChTVEFURV9OQU1FLCAKICAgICAgICAgICAgICAgIENOVFlfTkFNRSwgCiAgICAgICAgICAgICAgICBTVUJfUkVHSU9OLCAKICAgICAgICAgICAgICAgIGFnX3N0YXRfbmFtZSwgCiAgICAgICAgICAgICAgICBhZ19zdGF0X3ZhbHVlLCAKICAgICAgICAgICAgICAgIHllYXIsIAogICAgICAgICAgICAgICAgc3RhdCwgCiAgICAgICAgICAgICAgICBhZ19kZWx0YSkgJT4lCiAgZmlsdGVyKHN0YXQgPT0gIlJBVElPIikgJT4lCiAgZ3JvdXBfYnkoU1RBVEVfTkFNRSwgQ05UWV9OQU1FKSAlPiUKICBzdW1tYXJpc2UobWVhbl9hZyA9IG1lYW4oYWdfc3RhdF92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkgJT4lCiAgbGVmdF9qb2luKGJ1bWJsZXMuZGVsdGFyZWxhYnVuLmRmLAogICAgICAgICAgICBieSA9IGMoIkNOVFlfTkFNRSIgPSAiY291bnR5IiwgCiAgICAgICAgICAgICAgICAgICAiU1RBVEVfTkFNRSIgPSAic3RhdGVfZnVsbCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKG1lYW5fZGVsdGFfcmEpKSAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICBhbHBoYSA9IDAuMjUpICsgCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBtZWFuX2FnLAogICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9kZWx0YV9yYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IHNwZWNpZXMpLAogICAgICAgICAgICAgc2hhcGUgPSAyMSwKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKyAKICBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBtZWFuX2FnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fZGVsdGFfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNwZWNpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHNwZWNpZXMpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsCiAgICAgICAgICAgICAgc2UgPSBGQUxTRSkgKyAKICAjIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoeCA9IG1lYW5fYWcsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX2RlbHRhX3JhKSwKICAjICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsCiAgIyAgICAgICAgICAgICBjb2xvciA9ICJyZWQiLAogICMgICAgICAgICAgICAgc2l6ZSA9IDEuNSkgKyAKICB4bGltKDAsIDEpICsgCiAgeWxpbSgtMSwgMSkgKwogIHhsYWIoIk1lYW4gY291bnR5LWxldmVsIHByb3BvcnRpb24gYWciKSArIAogIHlsYWIoIk1lYW4gY2hhbmdlIGluIHJlbGF0aXZlIGFidW5kYW5jZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiaW5mZXJubyIsCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiaW5mZXJubyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEpICsgCiAgZmFjZXRfd3JhcCh+IHN1YmdlbnVzLAogICAgICAgICAgICAgbmNvbCA9IDQpICsKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImdyYXk1MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxLjI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gInRyYW5zcGFyZW50IikpCgpidW1ibGUuYnkuYWdyYXRpby5wbG90IDwtIGRpcmVjdC5sYWJlbChidW1ibGUuYnkuYWdyYXRpby5wbG90LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgic21hcnQuZ3JpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNleCA9IDAuNSkpCmJ1bWJsZS5ieS5hZ3JhdGlvLnBsb3QKZ2dzYXZlKCIuL2J1bWJsZV9ieWFncmF0aW9fcGxvdC5wbmciLAogICAgICAgYnVtYmxlLmJ5LmFncmF0aW8ucGxvdCwKICAgICAgIGhlaWdodCA9IDQuNSwKICAgICAgIHdpZHRoID0gNykKYGBgCgo=